
/*1 获取用户收货地址
    1, 绑定点击时间
    2, 调用小程序内置api 获取用户收货地址
    3. 将获取到的收货地址存储到本地存储中
  2 页面加载完毕后需要渲染收货地址
    1 onLoad生命周期函数
    2 获取本地存储里的数据
    3 把数据设置给data中的一个变量
    4 渲染到页面上去

  3 onShow 从缓存中读取购物车数据
    0 回到了商品详情页面 第一次加入购物车的时候 手动的添加了属性
        1 num=1  记录单个商品购买的总数
        2 checked=true 记录购物车中的数据是否全选
    1, 获取缓存中的购物车数组
    2 把购物车数据 填充到data中
    3 使用data 渲染页面

  4 全选实现 数据的展示
    1 onShow 获取到缓存中的购物车数组
    2 根据购物车中的商品数据 所有商品都被选中 checked=true 全选就被选中

  5 总价格和总数量
    1 都需要商品被选中 我们才拿它来计算
    2 获取购物车数组
    3 遍历
    4 判断商品是否被选中
    5 总价格 += 商品单价 * 商品数量
    6 总数量 += 商品的数量
    7 把计算后的价格和数量 设置会data中
  6 商品的选中
    1 绑定change事件
    2 获取到被修改的商品对象
    3 商品对象的选中状态 取反
    4 重新填充会data中和缓存中
    6 重新计算全选 总价格 总数量
  7 商品的全选和反选
    1 获取data中的数据
    2 修改allchecked
    3 循环修改cart数组中的商品选中状态
    4 把修改后的值 填充回data或者缓存中
  8 商品数量的编辑
    1 "+" "-" 按钮 绑定的是同一个点击事件 区分的关键在于
        给每一按钮添加新的属性  "+"  "+1"  "-" "-1"
    2 传递被点击商品的id  goods_id
    3 获取data中的购物车数组 通过id比对来获得需要被修改的商品对象
    4 直接修改商品对象的num属性
    5 把cart数组重新设置到data中和缓存中   this.setCart() 
  9 点击结算
  1 判断有没有收货地址
  2 判断用户有没有选购商品
  3 经过以上的验证 跳转到支付页面   
    */

// pages/cart/index.js
Page({

    data:{
        address:{},
        cart:[],
        allChecked:false,
        totalPrice:0,
        totalNum:0
    },

    onShow(){
        // 1 获取缓存中的收货地址信息
        let address=wx.getStorageSync("address")
        // address.all=address.provinceName+address.cityName+address.countyName+address.detailInfo
        // 1 获取缓存中的购物车数据   当cart不存在默认赋值为空数组
        const cart=wx.getStorageSync("cart")||[]
        // 计算全选
        // every数组方法 会接收一个回调函数 当每一个回调函数都为true 那么 every的返回值则为true
        // 只要有一个为false  那么every返回值直接为false
        // 空数组调用了every方法 返回值就是true
        // const allChecked=cart.length?cart.every(v=>v.checked):false;
        this.setCart(cart);
        this.setData({address});
    },
    // 点击收货地址触发事件
    handleChooseAddress(){
        // console.log("触发")
        // 获取用户收货地址
        wx.chooseAddress({
            success: (result)=>{
                console.log(result)
                // 写入本地缓存
                wx.setStorageSync("address", result);
            },
            fail: ()=>{},
            complete: ()=>{}
        });
    },
    // 商品的选中
    handleItemChange(e){
        // 1 获取被修改的商品id
        const goods_id=e.currentTarget.dataset.id;
        console.log(goods_id);
        // 2 获取购物车数组
        let {cart}=this.data;
        // 3 找到被修改的商品对象
        let index=cart.findIndex(v=>v.goods_id===goods_id);
        // 4 选中状态取反
        cart[index].checked=!cart[index].checked;
        // 5 6 把购物车数据重新设置会data和缓存中
        this.setCart(cart);
    },
    // 设置购物车状态的同时，重新计算 底部工具栏的数据 全选 总价格 购买数量
    setCart(cart){
        let allChecked=true;
        // 总价格 总数量
        let totalPrice=0;
        let totalNum=0;
        // 对cart中的每一条数据进行判断是否选中 计算选中数据的数量以及总价格
        // 因为forEach函数  对于空数组的判断也是true 所以需要判断数组是否为空
        cart.forEach(v=>{
            if(v.checked){
                totalPrice+=v.num*v.data.message.goods_price;
                totalNum+=v.num;
            }else{
                allChecked=false;
            }
        })

        // 判断数组是否为空 
        allChecked=cart.length!=0?allChecked:false;
        // 2 给data赋值
        this.setData({
            cart,
            allChecked,
            totalPrice,
            totalNum
        })
        wx.setStorageSync("cart", cart);
    },
    // 商品的全选功能
    handleItemAllCheck(){
        // 1 获取data中的数据
        let {cart, allChecked}=this.data;
        // 2 修改allchecked
        allChecked = !allChecked;
        // 3 循环修改cart数组中的商品选中状态
        cart.forEach(v=>v.checked=allChecked);
        // 4 把修改后的值 填充回data或者缓存中
        this.setCart(cart);
    },
    //商品数量的加减功能
    handleItemNumEdit(e){

        // 1 获取传递过来的参数
        const {operation, id} = e.currentTarget.dataset;
        // console.log(operation, id);
        // 2 获取购物车数组
        let {cart} = this.data;
        // 3 找到所需要修改的商品索引
        const index=cart.findIndex(v=>v.goods_id===id);
        // 4 判断是否要执行删除
        if(cart[index].num===1 && operation===-1){
            // 4.1 弹窗提示
            wx.showModal({
                title: '提示',
                content: '是否要删除商品',
                success: (res)=>{
                  if (res.confirm) {
                    cart.splice(index,1);
                    this.setCart(cart)
                  } else if (res.cancel) {
                    console.log('用户点击取消')
                  }
                }
              })
        }else{
            // 4.1 进行数量修改
            cart[index].num+=operation;
            // 5 设置会缓存和data中
            this.setCart(cart);
        }
        
    },
    // 点击结算
    handlePay(){
        // 1 判断收货地址
        const {address, totalNum}=this.data;
        if(!address.userName){
            wx.showToast({
                title: '请先添加收货地址',
                icon: 'none',
                duration: 2000
              })
            return;
        }
        // 判断是否选中商品
        if(totalNum===0){
            wx.showToast({
                title: '您还没有选购商品',
                icon: 'none',
                duration: 2000
              })
            return;
        }
        // 跳转到支付页面
        wx.navigateTo({
            url: '/pages/pay/index',
        });
    }
})